package client;

import java.util.List;

import org.testng.annotations.Test;
import org.testng.annotations.BeforeClass;
import org.testng.AssertJUnit;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.Test;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeClass;
import org.testng.AssertJUnit;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import org.testng.AssertJUnit;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

import usecases.GestionJoueur;
import usecases.GestionPartie;
import domaine.Joueur;
import domaine.Partie;
import domaine.Partie.Etat;


public class TestNG_GestionPartie {
	private static GestionPartie gp;
	private static GestionJoueur gj;
	private String pseudo1="Alexandre";
	private String password1="alexandre";
	private int age1=21;
	private String pseudo2="Merlin";
	private String password2="merlin";
	private int age2=21;
	private String pseudo3="Volkan";
	private String password3="volkan";
	private int age3=21;
	private Joueur joueur1 = new Joueur(pseudo1,password1,age1);
	private Joueur joueur2 = new Joueur(pseudo2,password2,age2);
	private Joueur joueur3 = new Joueur(pseudo3,password3,age3);
	private Partie part;
	private String titre = "Best party ever";
	
	@BeforeClass
	public static void setUpBeforeClass() {
		try {
			Context jndi = new InitialContext();
			gp = (GestionPartie) jndi.lookup("ejb:ZeldaVoloEar/ZeldaVoloEJB/GestionPartieImpl!usecases.GestionPartie");
			gj = (GestionJoueur) jndi.lookup("ejb:ZeldaVoloEar/ZeldaVoloEJB/GestionJoueurImpl!usecases.GestionJoueur");
		} catch (NamingException e) {
			e.printStackTrace();
		}
	}
	
	@BeforeMethod
	public void setUp(){
		 part = new Partie(joueur1, "Best party ever");
		 joueur1 = gj.inscrire(pseudo1, password1, age1);
		 joueur2 = gj.inscrire(pseudo2, password2, age2);
		 joueur3 = gj.inscrire(pseudo3, password3, age3);
	}
	
	@Test
	public void testCreerUnePartie(){
		
		part = gp.creerUnePartie(joueur1, titre);
		AssertJUnit.assertNotNull((Object) part);
		AssertJUnit.assertEquals(part.getNom(), titre);
		AssertJUnit.assertEquals(part.getNbJoueurs(), 1);
		AssertJUnit.assertEquals(part.joueurs().next().getId(), joueur1.getId());
		gp.quitterLaPartie(joueur1, part);
	}
	@AfterMethod
	public void execApresMethode(){
		
		gj.clear();
		gp.clear();
		
	}
	
	@Test
	public void testRejoindrePartieCorrect() {
		part = gp.creerUnePartie(joueur1, titre);
		AssertJUnit.assertNotNull(gp.rejoindreUnePartie(part.getId(), joueur2));
		AssertJUnit.assertNotNull(gp.rejoindreUnePartie(part.getId(), joueur3));
		gp.quitterLaPartie(joueur1, part);
		gp.quitterLaPartie(joueur2, part);
		gp.quitterLaPartie(joueur3, part);
	}
	/*
	@Test
	public void testRejoindrePartieIncorrect(){
		AssertJUnit.assertNotNull(gp.rejoindreUnePartie(part.getId(), joueur1));
	}
	
	@Test
	public void testListerPartiesEnAttente(){
		Partie partie = new Partie(joueur1, "Youhou");
		partie.setEtat(Etat.TERMINEE);
		AssertJUnit.assertTrue(gp.listerParties().contains(part));
		AssertJUnit.assertFalse(gp.listerPartiesEnAttente().contains(partie));
	}
	
	@Test
	public void testListerParties(){
		Partie partie = new Partie(joueur1, "Youhou");
		partie.setEtat(Etat.TERMINEE);
		AssertJUnit.assertTrue(gp.listerParties().contains(part));
		AssertJUnit.assertTrue(gp.listerPartiesEnAttente().contains(partie));
	}
	
	@Test
	public void testJouerUnePartie(){
		//TODO
	}
	
	@Test
	public void testVisualiserJournalPartie(){
		//TODO
	}
	
	@Test
	public void testQuitterLaPartieJoueurInscrit(){
		AssertJUnit.assertTrue(gp.quitterLaPartie(joueur1, part));
	}
	
	@Test
	public void testQuitterLaPartieJoueurNonInscrit(){
		AssertJUnit.assertFalse(gp.quitterLaPartie(joueur2, part));
	}
	
	@Test
	public void testQuitterLaPartiePartieTerminée(){
		part.setEtat(Etat.TERMINEE);
		AssertJUnit.assertFalse(gp.quitterLaPartie(joueur1, part));
	}
	
	@Test
	public void testListerJoueurs(){
		part.ajouterJoueur(joueur2);
		AssertJUnit.assertTrue(gp.listerJoueurs(part).contains(joueur1));
		AssertJUnit.assertTrue(gp.listerJoueurs(part).contains(joueur2));
	}
	
	@Test
	public void commencerPartiePasAssezDeJoueur(){
		AssertJUnit.assertFalse(gp.commencerPartie(part));
	}
	
	@Test
	public void commencerPartie(){
		part.ajouterJoueur(joueur2);
		AssertJUnit.assertTrue(gp.commencerPartie(part));
		AssertJUnit.assertFalse(gp.commencerPartie(part));
	}
	
	@Test
	public void testEstFinie(){
		AssertJUnit.assertFalse(gp.estFinie(part));
		part.setEtat(Etat.TERMINEE);
		AssertJUnit.assertTrue(gp.estFinie(part));
	}
	
	@Test
	public void annulerPartie(){
		AssertJUnit.assertTrue(gp.annulerPartie(part));
		AssertJUnit.assertFalse(gp.annulerPartie(part));
	}
	
	
//	public void testLancerDes1() {
//		int points = gp.lancerLesDes();
//		AssertJUnit.assertFalse(points == 0);
//		List<De> des = gp.listerDesJoues();
//		AssertJUnit.assertEquals(3, des.size());
//		int total = 0;
//		for (De de : des)
//			total += de.getValeur();
//		AssertJUnit.assertEquals(points, total);
//		AssertJUnit.assertEquals(points, gp.mesPoints());
//		System.out.println(gp.joueurCourant() + " lancer 1 : score obtenu : " + points);
//	}
//	
//	public void testEcarteDe1() {
//		AssertJUnit.assertTrue(gp.ecarterDe(3));
//		AssertJUnit.assertFalse(gp.ecarterDe(3));
//		List<De> des = gp.listerDesJoues();
//		AssertJUnit.assertEquals(2, des.size());
//	}
//	
//	public void testLancerDes2() {
//		int score = gp.mesPoints();
//		int points = gp.lancerLesDes();
//		AssertJUnit.assertFalse(points == 0);
//		AssertJUnit.assertFalse(points == -1);
//		List<De> des = gp.listerDesJoues();
//		AssertJUnit.assertEquals(2, des.size());
//		int total = 0;
//		for (De de : des)
//			total += de.getValeur();
//		AssertJUnit.assertEquals(points, total);
//		AssertJUnit.assertEquals(score + points, gp.mesPoints());
//		score += points;
//		System.out.println(gp.joueurCourant() + " lancer 2 : score obtenu : " + score);
//	}
//
//	public void testEcarteDe2() {
//		int score = gp.mesPoints();
//		boolean res = gp.ecarterDe(2);
//		if (score >= Partie.VINGT_ET_UN) {
//			AssertJUnit.assertFalse(res);
//			return;
//		}
//		AssertJUnit.assertTrue(res);
//		List<De> des = gp.listerDesJoues();
//		AssertJUnit.assertEquals(1, des.size());
//	}
//
//	public void testLancerDes3() {
//		int score = gp.mesPoints();
//		int points = gp.lancerLesDes();
//		if (score >= Partie.VINGT_ET_UN) {
//			AssertJUnit.assertEquals(-1, points);
//			return;
//		}
//		AssertJUnit.assertFalse(points == 0);
//		AssertJUnit.assertFalse(points == -1);
//		List<De> des = gp.listerDesJoues();
//		AssertJUnit.assertEquals(1, des.size());
//		int total = 0;
//		for (De de : des)
//			total += de.getValeur();
//		AssertJUnit.assertEquals(points, total);
//		AssertJUnit.assertEquals(score + points, gp.mesPoints());
//		score += points;
//		System.out.println(gp.joueurCourant() + " lancer 3 : score obtenu : " + score);
//	}
//	
//	public void testAuSuivant() {
//		AssertJUnit.assertTrue(gp.auSuivant());
//		AssertJUnit.assertEquals("Michel", gp.joueurCourant());
//	}
//	
//	public void testLancerDes1_j2() {
//		int points = gp.lancerLesDes();
//		AssertJUnit.assertFalse(points == 0);
//		List<De> des = gp.listerDesJoues();
//		AssertJUnit.assertEquals(3, des.size());
//		int total = 0;
//		for (De de : des)
//			total += de.getValeur();
//		AssertJUnit.assertEquals(points, total);
//		AssertJUnit.assertEquals(points, gp.mesPoints());
//		System.out.println(gp.joueurCourant() + " lancer 1 : score obtenu : " + points);
//	}
//	
//	public void testEcarteDe1_j2() {
//		AssertJUnit.assertTrue(gp.ecarterDe(3));
//		AssertJUnit.assertFalse(gp.ecarterDe(3));
//		List<De> des = gp.listerDesJoues();
//		AssertJUnit.assertEquals(2, des.size());
//	}
//	
//	public void testLancerDes2_j2() {
//		int score = gp.mesPoints();
//		int points = gp.lancerLesDes();
//		AssertJUnit.assertFalse(points == 0);
//		AssertJUnit.assertFalse(points == -1);
//		List<De> des = gp.listerDesJoues();
//		AssertJUnit.assertEquals(2, des.size());
//		int total = 0;
//		for (De de : des)
//			total += de.getValeur();
//		AssertJUnit.assertEquals(points, total);
//		AssertJUnit.assertEquals(score + points, gp.mesPoints());
//		score += points;
//		System.out.println(gp.joueurCourant() + " lancer 2 : score obtenu : " + score);
//	}
//
//	public void testEcarteDe2_j2() {
//		int score = gp.mesPoints();
//		boolean res = gp.ecarterDe(2);
//		if (score >= Partie.VINGT_ET_UN) {
//			AssertJUnit.assertFalse(res);
//			return;
//		}
//		AssertJUnit.assertTrue(res);
//		List<De> des = gp.listerDesJoues();
//		AssertJUnit.assertEquals(1, des.size());
//	}
//
//	public void testLancerDes3_j2() {
//		int score = gp.mesPoints();
//		int points = gp.lancerLesDes();
//		if (score >= Partie.VINGT_ET_UN) {
//			AssertJUnit.assertEquals(-1, points);
//			return;
//		}
//		AssertJUnit.assertFalse(points == 0);
//		AssertJUnit.assertFalse(points == -1);
//		List<De> des = gp.listerDesJoues();
//		AssertJUnit.assertEquals(1, des.size());
//		int total = 0;
//		for (De de : des)
//			total += de.getValeur();
//		AssertJUnit.assertEquals(points, total);
//		AssertJUnit.assertEquals(score + points, gp.mesPoints());
//		score += points;
//		System.out.println(gp.joueurCourant() + " lancer 3 : score obtenu : " + score);
//	}
//
//	public void testAuSuivant2() {
//		AssertJUnit.assertTrue(gp.auSuivant());
//		AssertJUnit.assertEquals("Olivier", gp.joueurCourant());
//	}
//	
//	public void testLancerDes1_j3() {
//		int points = gp.lancerLesDes();
//		AssertJUnit.assertFalse(points == 0);
//		List<De> des = gp.listerDesJoues();
//		AssertJUnit.assertEquals(3, des.size());
//		int total = 0;
//		for (De de : des)
//			total += de.getValeur();
//		AssertJUnit.assertEquals(points, total);
//		AssertJUnit.assertEquals(points, gp.mesPoints());
//		System.out.println(gp.joueurCourant() + " lancer 1 : score obtenu : " + points);
//	}
//	
//	public void testEcarteDe1_j3() {
//		AssertJUnit.assertTrue(gp.ecarterDe(3));
//		AssertJUnit.assertFalse(gp.ecarterDe(3));
//		List<De> des = gp.listerDesJoues();
//		AssertJUnit.assertEquals(2, des.size());
//	}
//	
//	public void testLancerDes2_j3() {
//		int score = gp.mesPoints();
//		int points = gp.lancerLesDes();
//		AssertJUnit.assertFalse(points == 0);
//		AssertJUnit.assertFalse(points == -1);
//		List<De> des = gp.listerDesJoues();
//		AssertJUnit.assertEquals(2, des.size());
//		int total = 0;
//		for (De de : des)
//			total += de.getValeur();
//		AssertJUnit.assertEquals(points, total);
//		AssertJUnit.assertEquals(score + points, gp.mesPoints());
//		score += points;
//		System.out.println(gp.joueurCourant() + " lancer 2 : score obtenu : " + score);
//	}
//
//	public void testEcarteDe2_j3() {
//		int score = gp.mesPoints();
//		boolean res = gp.ecarterDe(2);
//		if (score >= Partie.VINGT_ET_UN) {
//			AssertJUnit.assertFalse(res);
//			return;
//		}
//		AssertJUnit.assertTrue(res);
//		List<De> des = gp.listerDesJoues();
//		AssertJUnit.assertEquals(1, des.size());
//	}
//
//	public void testLancerDes3_j3() {
//		int score = gp.mesPoints();
//		int points = gp.lancerLesDes();
//		if (score >= Partie.VINGT_ET_UN) {
//			AssertJUnit.assertEquals(-1, points);
//			return;
//		}
//		AssertJUnit.assertFalse(points == 0);
//		AssertJUnit.assertFalse(points == -1);
//		List<De> des = gp.listerDesJoues();
//		AssertJUnit.assertEquals(1, des.size());
//		int total = 0;
//		for (De de : des)
//			total += de.getValeur();
//		AssertJUnit.assertEquals(points, total);
//		AssertJUnit.assertEquals(score + points, gp.mesPoints());
//		score += points;
//		System.out.println(gp.joueurCourant() + " lancer 3 : score obtenu : " + score);
//	}
//	
//	public void testAuSuivant3() {
//		AssertJUnit.assertFalse(gp.auSuivant());
//		AssertJUnit.assertEquals(null, gp.joueurCourant());
//	}
//
//	public void testVainqueur() {
//		String v = gp.vainqueur();
//		if (v == null)
//			System.out.println("Il n'y a pas de vainqueur");
//		else
//			System.out.println("Le vainqueur est " + v);
//		AssertJUnit.assertTrue(gp.estFinie());
//	}*/
}
